/**
 * @author John Resig- http://ejohn.org
 * @license MIT-license
 * @fileoverview 
 * 1. John Resig의 Micro-Templating의 Template 코드입니다. tmpl()의 3항 연산자 부분 및 
 * 		Separator가 <%, %>에서 {% %}로 변경되었습니다.
 * 2. Jindo의 $Template과 같이 new로 생성하며
 * 3. Template이 저장되어 있는 script의 id나 Template text를 인자로 받습니다. 
 * 3. process(data) 를 사용하여 HTML 또는 Text를 생성합니다.  
 */

luffy.common.Template = {
	/**
	 * 템플릿이 저장되어 있는 Script tag의 id나 템플릿 문자열을 인자로 받아서 템플릿 생성 객체를
	 * 생성해서 리턴합니다.  
	 * @param {String} idOrTemplate 템플릿이 저장되어 있는 Script tag의 id나 템플릿 문자열 
	 */
	get: function(idOrTemplate) {
		var tmplFunction; 
		if (typeof idOrTemplate == "function") {
			tmplFunction = idOrTemplate;
		} else {
			var tmpl = document.getElementById(idOrTemplate);
			tmpl = tmpl ? tmpl.innerHTML: idOrTemplate;
			tmplFunction = this._toTemplate(tmpl)
		}
		return this._getFnTemplate(tmplFunction);
	},	
	
	_getFnTemplate: function(tmplFunction) {
		return new (function(tmplFunction) {
			/**
			 * tmplFunction을 이용하여 문자열을 생성하여 리턴합니다. 
			 * @param {Object} data template에서 치환될 변수들에 대입하는 값들입니다. 
			 */
			this.process = function(data) {
				return data ? tmplFunction( data ) : tmplFunction("");
			};
			
			this.processWithTrim = function(data) {
				var processed = jindo.$S(this.process(data));
				return processed.trim().$value();
			};			
		})(tmplFunction);
	},
		
	_toTemplate: function(rawTmpl) {
		rawTmpl = rawTmpl.replace(/({%)([^%}]*)({|})([^%}]*)(%})/g, "$1 $2 $3 $4 $5");

		return (new Function("obj",
			     "var p=[];" +
			     "with(obj){p.push('" +
			     rawTmpl
			       .replace(/[\r\t\n]/g, " ")
			       .split("{%")
			       .join("\t")
			       .replace(/((^|%})[^\t]*)'/g, "$1\r")
	    		   .replace(/'/g, "\r")
			       .replace(/\t=(.*?)%}/g, "',$1,'")
			       .split("\t")
			       .join("');")
			       .split("%}")
			       .join("p.push('")
			       .split("\r")
			       .join("\\'")
			   + "');}return p.join('');"
		));
	}		
}